如何创建"上下文"式右键菜单

菜单常见的形式有两种,一种是在标题栏处的标准菜单样式,另外一种称之为"上下文"菜单,常常在右击时,在鼠标所在的位置弹出一个菜单,可以使用CMenu::TrackPopupMenu函数来实现这一功能,步骤如下:

(1)创建一个基于对话框的、使用MFC库的Windows应用程序工程。

(2)使用向导实现主对话框类对消息WM_CONTEXTMENU的响应,向导添加类似下面的代码:

afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);

void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)

{

// TODO: Add your message handler code here

// TODO: Add your control notification handler code here

}

(3)在资源视图中插入一个MENU菜单,资源ID为IDR_MENU1。其中菜单项A、B、C的ID代码分别为ID_ MENUITEM_A、ID_MENUITEM_B、ID_MENUITEM_C。

(4)实现OnContextMenu函数的代码如下:

void CXXDlg::OnContextMenu(CWnd* pWnd, CPoint point)

{

// TODO: Add your message handler code here

// TODO: Add your control notification handler code here

CMenu menu;

// 装入菜单

menu.LoadMenu(IDR_MENU1);

// 显示菜单(第一个子菜单项)

menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x, point.y, this);

}

(5)实现菜单项A、B、C的事件响应,在CXXDlg类头文件和cpp文件中添加如下代码:

//.h文件

afx_msg void OnMenuitemA();

afx_msg void OnMenuitemB();

afx_msg void OnMenuitemB();

//cpp文件

BEGIN_MESSAGE_MAP(CMFCDlg, CDialog)

//{{AFX_MSG_MAP(CMFCDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_CONTEXTMENU()

ON_COMMAND(ID_MENUITEM_A, OnMenuitemA)

ON_COMMAND(ID_MENUITEM_B, OnMenuitemB)

ON_COMMAND(ID_MENUITEM_C, OnMenuitemC)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()void CXXDlg::OnMenuitemA()

{

// TODO: Add your command handler code here

AfxMessageBox("A");

}

void CXXDlg::OnMenuitemB()

{

// TODO: Add your command handler code here

AfxMessageBox("B");

}

void CXXDlg::OnMenuitemC()

{

// TODO: Add your command handler code here

AfxMessageBox("C");

}

(6)按Ctrl+F5键编译并运行程序。

注意:除了本节中介绍的使用WM_CONTEXTMENU消息响应函数来显示动态创建的菜单之外,还有另外一种方法可以使用,而且更加的灵活,即响应鼠标右击消息,然后处理右击消息的函数体内调用相关函数获得鼠标的位置,再创建CMenu对象,调用成员函数TrackPopupMenu来显示创建的上下文菜单。